<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script>
// 함수의 호출패턴은 4가지가 있다. 1.메소드 호출, 2.함수호출 , 3.생성자 호출 ,  4.apply호출

//1. 메소드  호출 : 객체속성에 정의된함수를 메소드라하고 메소드를 호출할때 this는 해당 객체에 바인딩 된다. 
// ->함수 호출시 추가로 전달되는 인자는 this,arguments 
	var global = "global valiable";
	
	var myObject={
			value:0,
			increment:function(inc){
				this.value += typeof inc ==='number'?inc:1;
			}
	};
	
	myObject.increment(); 
	pt(myObject.value);    //1
	
	myObject.increment(2);
	pt(myObject.value);   //3

//2. 함수호출: 함수가 객체의 속성이 아닐경우 함수로 호출 함수호출의 경우 this는 전역객체에 바인딩 된다. 
// -> 메소드에서 this를  변수에 저장한후 전달하면 객체를  참조할수 있게 할수 있다. 
	myObject.double = function(){
		var that = this;
		var helper = function(){
			//this.value = add(this.value,this.value);   ->this는 전역에 바인딩 됨으로 myObject.value에 영향을  미치지 못한다. //helper를 외부로 빼도  동일함.
			that.value = add(that.value,that.value);			
		};
		helper();
	}
	
	myObject.double();
	pt(myObject.value);  //6

//3.생성자 호출:
	var Quo = function(string){
		this.status = string;
	}
	
	Quo.prototype.getStatus = function(){   //Quo의 모든 인스턴스에 public 메소드 생성
		return this.status;
	}
	
	var myQuo = new Quo("confused");    //생성자 함수 호출은 권장사항은  아니다. 
	pt(myQuo.getStatus());   //confused
	
//4.apply 호출:  parameter : 1=this로 묶이게 될 값, 2=매개변수 배열
	var array=[3,4];
	var sum  = add.apply(null,array);
	pt(sum)  //7
	
	var statusObject = {
		status : "A-ok"
	};
	
	//statusObject는  Quo.prototype을 상속받지 않지만, Quo에 있는  getStatus메소드가 statusObject를 대상으로 실행되도록 호출할수 있다. 
	var status = Quo.prototype.getStatus.apply(statusObject);
	pt(status);
	

	function pt(str){
		document.write("<br>"+str);
	}
	
	function add(a,b){
		return a+b;
	}
</script>
</head>
<body>

</body>
</html>